
/* 包含头文件代码 */
#include <stdio.h>
#include <stdint.h> 

/*******************************************************************************
 * Definitions
 ******************************************************************************/

/* 私有(仅本源文件内使用)宏、枚举、结构体的定义 */
// typedef struct
// {
//     float height;
//     float weight;
//     float bmi;
// } test_struct_t;


/*******************************************************************************
 * Prototypes
 ******************************************************************************/

/* 内部函数(即 static 修饰)的声明 */



/*******************************************************************************
 * Variables
 ******************************************************************************/

/* 所有全局变量(外部，静态，常量，指针)的定义 */



/*******************************************************************************
 * Code
 ******************************************************************************/

/* 所有函数(外部，内部)的定义 */


/**
 * Calculates Body Mass Index (BMI).
 * 
 * BMI is a standard metric used to assess the health of an individual's weight status, 
 * defined as weight in kilograms divided by the square of height in meters.
 * 
 * @param height The height of the individual in meters.
 * @param weight The weight of the individual in kilograms.
 * @return Returns the calculated BMI value.
 */
float bmi_calc(float height, float weight)
{
    // Calculates BMI using the formula: BMI = weight / (height * height)
    float bmi = weight / (height * height);
    return bmi;
}

/**
 * 计算体脂率
 * 
 * @param gender 性别，0代表男性，非0代表女性
 * @param waistline 腰围，单位厘米
 * @param height 身高，单位米
 * @param weight 体重，单位千克
 * @return 返回体脂率，如果输入数据无效（如体重为0），则返回-1.0f
 * 
 * 该函数根据性别、腰围、身高和体重计算体脂率使用了特定的算法，其中包括计算BMI和根据性别调整体脂率计算公式
 */
float body_fat_rate(uint8_t gender, float waistline, float height, float weight)
{
    // 检查体重是否为零，避免除零错误
    if (weight == 0)
    {
        return -1.0f; // 假设 -1.0f 表示错误
    }

    // 计算 BMI
    float bmi = weight / (height * height);

    // 计算中间项
    float term = bmi * 0.082 + 34.89;

    // 根据性别计算体脂率
    if (0 == gender)//男性
    {
        return waistline * 0.74 - term / weight * 0.765;
    }
    else
    {
        return waistline * 0.74 - term / weight;
    }
}


/**
 * 计算人体水分百分比
 * 
 * @param age 年龄，用于分类计算
 * @param gender 性别，0代表男性，非0代表女性，用于区分不同性别的计算公式
 * @param height 身高，单位为米，用于计算BMI
 * @param weight 体重，单位为千克，用于计算BMI
 * @return 返回人体水分百分比，基于BMI和性别差异计算得出
 */
float water_percentage(uint8_t age, uint8_t gender, float height, float weight)
{
    // 计算BMI（Body Mass Index），用于后续的水分百分比计算
    float bmi = weight / (height * height);

    // 根据性别和BMI值，选择合适的计算公式
    if (gender == 0)// 男性
    {
        // 男性BMI在20到30之间时的计算公式
        if (bmi >= 20 && bmi <= 30)
        {
            return -1.383 * bmi + 89.9;
        }
        // 男性BMI在30到60之间时的计算公式
        else if (bmi > 30 && bmi <= 60)
        {
            return -1.289 * bmi + 83.84;
        }else
        {
            // 男性BMI不在上述范围时的计算公式
            return -1.214 * bmi + 78.91;
        }
    }
    else// 女性
    {
        // 女性BMI在20到30之间时的计算公式
        if (bmi >= 20 && bmi <= 30)
        {
            return -1.4 * bmi + 86.64;
        }
        // 女性BMI在30到60之间时的计算公式
        else if (bmi > 30 && bmi <= 60)
        {
            return -1.23 * bmi + 76.12;
        }else
        {
            // 女性BMI不在上述范围时的计算公式
            return -1.039 * bmi + 64.34;
        }
    }
}

/**
 * Calculates the water content.
 * 
 * This function computes the water content in a substance based on the given water percentage and weight.
 * It primarily applies to scenarios requiring the estimation of water volume, providing data support for further processing or analysis.
 * 
 * @param water_percentage The percentage of water, representing the proportion of water in the total weight.
 * @param weight The total weight of the substance, used to calculate the absolute water content.
 * @return Returns the calculated water content.
 */
float water_content(float water_percentage, float weight)
{
    return water_percentage * weight;
}

/**
 * 根据性别、身高和体重估算骨量
 * 
 * @param gender 性别，0代表男，非0代表女
 * @param height 身高，单位为厘米
 * @param weight 体重，单位为千克
 * @return 返回估算的骨量，单位为克/厘米^2
 * 
 * 本函数使用特定公式估算个体的骨量，考虑到性别差异对骨量的影响
 * 男性和女性使用不同的计算公式，以提高估算的准确性
 */
float bone_mass(uint8_t gender, float height, float weight)
{
    if (gender == 0)//男
    {
        return ((weight - (height - 80) * 0.7 + 1) * 0.0018 + 0.243) * 100;
    }
    else//女
    {
        return ((weight - (height - 80) * 0.6 + 1) * 0.0018 + 0.243) * 100;
    }
}


/**
 * 计算肌肉比率的函数。
 * 
 * 本函数通过骨质重量和总体重来计算肌肉比率，实际上这是一个简化的计算模型。
 * 肌肉比率的计算公式是：(骨质重量 / 总体重) * 100，结果以百分比形式表示。
 * 这个比率可以帮助理解个体的肌肉发展情况，但需要注意的是，此计算方法并未直接测量肌肉质量，
 * 而是基于骨质重量作为间接指标，因此只能提供一个粗略的估计。
 * 
 * @param bone_mass 骨质重量，单位为千克。
 * @param weight 总体重，单位为千克。
 * @return 返回计算得到的肌肉比率，以百分比形式表示。
 */
float muscle_rate(float bone_mass, float weight)
{
    return bone_mass / weight * 100;
}

enum
{
    LOW_FAT = 0,
    MIDDLE_FAT,
    NORMAL_FAT,
    HIGH_FAT,
    EXTREME_FAT,
    OVERWEIGHT
};
/**
 * Determines the body type based on gender and BMI.
 * 
 * @param gender The gender of the person, where 0 represents female and 1 represents male.
 * @param bmi The Body Mass Index (BMI) of the person.
 * @return Returns the body type, including LOW_FAT, MIDDLE_FAT, NORMAL_FAT, HIGH_FAT, EXTREME_FAT, and OVERWEIGHT.
 * 
 * This function uses different BMI ranges for females and males to determine the body type.
 * For females, the BMI ranges are as follows:
 * - LOW_FAT: BMI < 18.5
 * - MIDDLE_FAT: 18.5 <= BMI <= 20.5
 * - NORMAL_FAT: 20.5 < BMI <= 23
 * - HIGH_FAT: 23 < BMI <= 25.5
 * - EXTREME_FAT: 25.5 < BMI <= 29.9
 * - OVERWEIGHT: BMI > 29.9
 * 
 * For males, the BMI ranges are as follows:
 * - LOW_FAT: BMI < 19
 * - MIDDLE_FAT: 19 <= BMI <= 21
 * - NORMAL_FAT: 21 < BMI <= 24
 * - HIGH_FAT: 24 < BMI <= 25.5
 * - EXTREME_FAT: 25.5 < BMI <= 29.9
 * - OVERWEIGHT: BMI > 29.9
 */
char body_type(uint8_t gender, float bmi)
{
    if (gender == 0){
        if (bmi < 18.5)
        {
            return LOW_FAT;
        }
        else if (bmi >= 18.5 && bmi <= 20.5)
        {
            return MIDDLE_FAT;
        }
        else if (bmi > 20.5 && bmi <= 23)
        {
            return NORMAL_FAT;
        }
        else if (bmi > 23 && bmi <= 25.5)
        {
            return HIGH_FAT;
        }
        else if (bmi > 25.5 && bmi <= 29.9)
        {
            return EXTREME_FAT;
        }
        else
        {
            return OVERWEIGHT;
        }

    }
    else
    {
        if (bmi < 19)
        {
            return LOW_FAT;
        }
        else if (bmi >= 19 && bmi <= 21)
        {
            return MIDDLE_FAT;
        }
        else if (bmi > 21 && bmi <= 24)
        {
            return NORMAL_FAT;
        }
        else if (bmi > 24 && bmi <= 25.5)
        {
            return HIGH_FAT;
        }
        else if (bmi > 25.5 && bmi <= 29.9)
        {
            return EXTREME_FAT;
        }
        else
        {
            return OVERWEIGHT;
        }
    }
}



void CaculateVchBodyComp(uint8_t age, uint8_t gender, float height, float weight)
